import { createApp } from "vue";

import Cookies from "js-cookie";

import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import "element-plus/theme-chalk/dark/css-vars.css";
import locale from "element-plus/es/locale/lang/zh-cn";

import "@/assets/styles/index.scss"; // global css

import App from "./App";
import store from "./store";
import router from "./router";
import directive from "./directive"; // directive

// 注册指令
import plugins from "./plugins"; // plugins
import { download } from "@/utils/request";

// svg图标
import "virtual:svg-icons-register";
import SvgIcon from "@/components/SvgIcon";
import elementIcons from "@/components/SvgIcon/svgicon";

import "./permission"; // permission control

import { useDict } from "@/utils/dict";
import { getConfigKey } from "@/api/system/config";
import {
  parseTime,
  resetForm,
  addDateRange,
  handleTree,
  selectDictLabel,
  selectDictLabels,
} from "@/utils/ruoyi";

// 分页组件
import Pagination from "@/components/Pagination";
// 自定义表格工具组件
import RightToolbar from "@/components/RightToolbar";
// 富文本组件
import Editor from "@/components/Editor";
// 文件上传组件
import FileUpload from "@/components/FileUpload";
// 图片上传组件
import ImageUpload from "@/components/ImageUpload";
// 图片预览组件
import ImagePreview from "@/components/ImagePreview";
// 字典标签组件
import DictTag from "@/components/DictTag";

import { createProvider, LocalService, ContextMode } from "@vtj/renderer";
import { createModules } from "./modules";
const app = createApp(App);
const service = new LocalService();
const { provider, onReady } = createProvider({
  materialPath: "/",
  // 设置运行环境
  nodeEnv: process.env.NODE_ENV,
  mode: ContextMode.Runtime,
  // 注册应用模块
  modules: createModules(),
  // 注入服务实例
  service,
  // 注入路由实例
  router,
  dependencies: {
    Vue: () => import("vue"),
    VueRouter: () => import("vue-router"),
    ElementPlus: () => import("element-plus"),
  },
  project: {
    id: "ruoyi",
  },
  routeAppendTo: "Pages",
  enableStaticRoute: true,
});

onReady(async () => {
  // 全局方法挂载
  app.config.globalProperties.useDict = useDict;
  app.config.globalProperties.download = download;
  app.config.globalProperties.parseTime = parseTime;
  app.config.globalProperties.resetForm = resetForm;
  app.config.globalProperties.handleTree = handleTree;
  app.config.globalProperties.addDateRange = addDateRange;
  app.config.globalProperties.getConfigKey = getConfigKey;
  app.config.globalProperties.selectDictLabel = selectDictLabel;
  app.config.globalProperties.selectDictLabels = selectDictLabels;

  // 全局组件挂载
  app.component("DictTag", DictTag);
  app.component("Pagination", Pagination);
  app.component("FileUpload", FileUpload);
  app.component("ImageUpload", ImageUpload);
  app.component("ImagePreview", ImagePreview);
  app.component("RightToolbar", RightToolbar);
  app.component("Editor", Editor);

  app.use(router);
  app.use(store);
  app.use(plugins);
  app.use(elementIcons);
  app.component("svg-icon", SvgIcon);

  directive(app);

  // 使用element-plus 并且设置全局的大小
  app.use(ElementPlus, {
    locale: locale,
    // 支持 large、default、small
    size: Cookies.get("size") || "default",
  });
  app.use(provider);
  app.mount("#app");
});
